home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / program / ddj0897.zip / DYN401.ZIP / class / string.c < prev    next >
C/C++ Source or Header  |  1997-04-16  |  24KB  |  1,081 lines

  1.  
  2.  
  3. /*  Copyright (c) 1993-1996 Algorithms Corporation  */
  4. /*  All rights reserved.  */
  5.  
  6.  
  7.  
  8.  
  9. /*  This file automatically generated by dpp - do not edit  */
  10.  
  11. #define    DPP_STRATEGY    2
  12. #define    DPP_FASTWIDE    0
  13.  
  14.  
  15.  
  16. #line 16 "string.d"
  17. #include "memalloc.h" 
  18. #include <ctype.h> 
  19. #include <string.h> 
  20. #include <math.h> 
  21.  
  22. #if 0 
  23. #define ADJUST 
  24. #endif 
  25.  
  26. #define    CLASS    String_c
  27. #define    ivType    String_iv_t
  28.  
  29. #include "generics.h"
  30.  
  31. object    String_c;
  32.  
  33.  
  34. #line 35 "string.c"
  35. typedef struct  _String_iv_t  {
  36.     char * iStr;
  37.     int iSize;
  38.     int iLen;
  39.     int iBlksz;
  40.     int iCalcLen;
  41.     int iFum;
  42. }    String_iv_t;
  43.  
  44.  
  45. #line 41 "string.d"
  46. #define SETSIZE(x) iv->iSize = ((x) ? (((x)-1)/iv->iBlksz + 1) * iv->iBlksz : 0) 
  47.  
  48. #define ABS 40 
  49.  
  50. #define UPDATE_LEN if (iv->iCalcLen) iv->iLen = strlen(iv->iStr) 
  51.  
  52.  
  53. #ifndef max 
  54. #define max(a,b) ((a) > (b) ? (a) : (b)) 
  55. #endif 
  56.  
  57.  
  58. #ifdef ADJUST 
  59.  
  60.  
  61.  
  62.  
  63. #define FREE_UNUSED if (iv->iFum && iv->iLen+1 <= iv->iSize-iv->iBlksz) { SETSIZE(iv->iLen+1); iv->iStr = (char *) MA_realloc(iv->iStr, iv->iSize); } 
  64. #else 
  65. #define FREE_UNUSED 
  66. #endif 
  67.  
  68.  
  69. static int get_string(object, char **, char *, int); 
  70.  
  71.  
  72.  
  73. cmeth objrtn New(object self, char *so)
  74.     object obj = oSuper(String_c, gNew, self)(self); 
  75.     ivType *iv = ivPtr(obj); 
  76.     char *str; 
  77.     int len; 
  78.  
  79.     len = get_string((object) so, &str, "New", 2); 
  80.     iv->iBlksz = 1; 
  81.     SETSIZE(len + 1); 
  82.     iv->iStr = (char *) MA_malloc(iv->iSize, &iv->iStr); 
  83.     if (len) 
  84.         memcpy(iv->iStr, str, len); 
  85.     iv->iStr[len] = '\0'; 
  86.     iv->iLen = len; 
  87.     return(obj); 
  88.  
  89. cmeth objrtn String_cm_gNewWithInt(object self, int len)
  90.     object obj = oSuper(String_c, gNew, self)(self); 
  91.     ivType *iv = ivPtr(obj); 
  92.  
  93.     iv->iBlksz = 1; 
  94.     SETSIZE(len + 1); 
  95.     iv->iStr = (char *) MA_malloc(iv->iSize, &iv->iStr); 
  96.     *iv->iStr = '\0'; 
  97.     iv->iCalcLen = 1; 
  98.     iv->iLen = 0; 
  99.     return(obj); 
  100.  
  101. cmeth objrtn String_cm_gNewWithObj(object self, object so)
  102.     return New(self, (char *) so); 
  103.  
  104. cmeth objrtn String_cm_gNew(object self)
  105.     return New(self, ""); 
  106.  
  107. imeth char * String_im_gStringValue(object self)
  108. { String_iv_t *iv = GetIVs(String, self);
  109.     return iv->iStr; 
  110.  
  111. imeth int String_im_gSize(object self)
  112. { String_iv_t *iv = GetIVs(String, self);
  113.     UPDATE_LEN; 
  114.     return iv->iLen; 
  115.  
  116. imeth objrtn ChangeValue(object self, object obj)
  117. { String_iv_t *iv = GetIVs(String, self);
  118.     char *str; 
  119.     int len; 
  120.  
  121.     len = get_string(obj, &str, "ChangeValue", 2); 
  122.     iv->iLen = len; 
  123.     if (len >= iv->iSize) { 
  124.         SETSIZE(iv->iLen + 1); 
  125.         iv->iStr = (char *) MA_realloc(iv->iStr, iv->iSize); 
  126.     } 
  127.     if (len) 
  128.         memcpy(iv->iStr, str, len); 
  129.     iv->iStr[len] = '\0'; 
  130.     FREE_UNUSED; 
  131.     return self; 
  132.  
  133. imeth objrtn String_im_gChangeStrValue(object self, char *str)
  134.     return ChangeValue(self, (object) str); 
  135.  
  136. imeth objrtn String_im_gDispose(object self)
  137. { String_iv_t *iv = GetIVs(String, self);
  138.     if (iv->iStr) 
  139.         MA_free(iv->iStr); 
  140.     return oSuper(String_c, gDispose, self)(self); 
  141.  
  142. imeth int String_im_gHash(object self)
  143. { String_iv_t *iv = GetIVs(String, self);
  144.     register char c = 'a'; 
  145.     char *s = iv->iStr; 
  146.     double t; 
  147.     register unsigned short k=0; 
  148.  
  149.     while (*s) 
  150.         k += *s++ ^ c++; 
  151.     t = .6125423371 * k; 
  152.     return (int) (BIG_INT * (t - floor(t))); 
  153.  
  154. imeth int String_im_gCompare(object self, object obj)
  155. { String_iv_t *iv = GetIVs(String, self);
  156.     char *s, *t; 
  157.     int tlen, slen; 
  158.  
  159.     if (IsObj(obj)) { 
  160.         ivType *iv2; 
  161.  
  162.         if (!gIsKindOf(obj, CLASS)) 
  163.             return oSuper(String_c, gCompare, self)(self, obj); 
  164.         iv2 = ivPtr(obj); 
  165.         t = iv2->iStr; 
  166.         if (iv2->iCalcLen) 
  167.             iv2->iLen = strlen(t); 
  168.         tlen = iv2->iLen; 
  169.     } else { 
  170.         t = (char *) obj; 
  171.         tlen = t ? strlen(t) : 0; 
  172.     } 
  173.     UPDATE_LEN; 
  174.     slen = iv->iLen; 
  175.     s = iv->iStr; 
  176.     while (slen && tlen && *s == *t) { 
  177.         s++; 
  178.         t++; 
  179.         slen--; 
  180.         tlen--; 
  181.     } 
  182.     if (!slen && !tlen) 
  183.         return 0; 
  184.     if (!slen) 
  185.         return -1; 
  186.     if (!tlen) 
  187.         return 1; 
  188.     return *(unsigned char *)s - *(unsigned char *)t; 
  189.  
  190. imeth int String_im_gCompareI(object self, object obj)
  191. { String_iv_t *iv = GetIVs(String, self);
  192.     char *s, *t; 
  193.     int tlen, slen; 
  194.  
  195.     if (IsObj(obj)) { 
  196.         ivType *iv2; 
  197.  
  198.         if (!gIsKindOf(obj, CLASS)) 
  199.             gError(self, "CompareI::String:  Arg 2 incorrect type.\n"); 
  200.         iv2 = ivPtr(obj); 
  201.         t = iv2->iStr; 
  202.         if (iv2->iCalcLen) 
  203.             iv2->iLen = strlen(t); 
  204.         tlen = iv2->iLen; 
  205.     } else { 
  206.         t = (char *) obj; 
  207.         tlen = t ? strlen(t) : 0; 
  208.     } 
  209.     UPDATE_LEN; 
  210.     slen = iv->iLen; 
  211.     s = iv->iStr; 
  212.     while (slen && tlen && tolower(*s) == tolower(*t)) { 
  213.         s++; 
  214.         t++; 
  215.         slen--; 
  216.         tlen--; 
  217.     } 
  218.     if (!slen && !tlen) 
  219.         return 0; 
  220.     if (!slen) 
  221.         return -1; 
  222.     if (!tlen) 
  223.         return 1; 
  224.     return tolower(*(unsigned char *)s) - tolower(*(unsigned char *)t); 
  225.  
  226. imeth int String_im_gCompareN(object self, object obj, int n)
  227. { String_iv_t *iv = GetIVs(String, self);
  228.     char *s, *t; 
  229.     int tlen, slen; 
  230.  
  231.     if (IsObj(obj)) { 
  232.         ivType *iv2; 
  233.  
  234.         if (!gIsKindOf(obj, CLASS)) 
  235.             gError(self, "CompareN::String:  Arg 2 incorrect type.\n"); 
  236.         iv2 = ivPtr(obj); 
  237.         t = iv2->iStr; 
  238.         if (iv2->iCalcLen) 
  239.             iv2->iLen = strlen(t); 
  240.         tlen = iv2->iLen; 
  241.     } else { 
  242.         t = (char *) obj; 
  243.         tlen = t ? strlen(t) : 0; 
  244.     } 
  245.     UPDATE_LEN; 
  246.     slen = iv->iLen; 
  247.     s = iv->iStr; 
  248.     while (n && slen && tlen && *s == *t) { 
  249.         s++; 
  250.         t++; 
  251.         n--; 
  252.         slen--; 
  253.         tlen--; 
  254.     } 
  255.     if (!n || !slen && !tlen) 
  256.         return 0; 
  257.     if (!slen) 
  258.         return -1; 
  259.     if (!tlen) 
  260.         return 1; 
  261.     return *(unsigned char *)s - *(unsigned char *)t; 
  262.  
  263. imeth int String_im_gCompareNI(object self, object obj, int n)
  264. { String_iv_t *iv = GetIVs(String, self);
  265.     char *s, *t; 
  266.     int tlen, slen; 
  267.  
  268.     if (IsObj(obj)) { 
  269.         ivType *iv2; 
  270.  
  271.         if (!gIsKindOf(obj, CLASS)) 
  272.             gError(self, "CompareNI::String:  Arg 2 incorrect type.\n"); 
  273.         iv2 = ivPtr(obj); 
  274.         t = iv2->iStr; 
  275.         if (iv2->iCalcLen) 
  276.             iv2->iLen = strlen(t); 
  277.         tlen = iv2->iLen; 
  278.     } else { 
  279.         t = (char *) obj; 
  280.         tlen = t ? strlen(t) : 0; 
  281.     } 
  282.     UPDATE_LEN; 
  283.     slen = iv->iLen; 
  284.     s = iv->iStr; 
  285.     while (n && slen && tlen && tolower(*s) == tolower(*t)) { 
  286.         s++; 
  287.         t++; 
  288.         n--; 
  289.         slen--; 
  290.         tlen--; 
  291.     } 
  292.     if (!n || !slen && !tlen) 
  293.         return 0; 
  294.     if (!slen) 
  295.         return -1; 
  296.     if (!tlen) 
  297.         return 1; 
  298.     return tolower(*(unsigned char *)s) - tolower(*(unsigned char *)t); 
  299.  
  300. imeth objrtn String_im_gStringRepValue(object self)
  301. { String_iv_t *iv = GetIVs(String, self);
  302.     return vSprintf(String, "\"%s\"", iv->iStr ? iv->iStr : "(null)"); 
  303.  
  304. imeth int String_im_gPrintLength(object self, int t)
  305. { String_iv_t *iv = GetIVs(String, self);
  306.     register int n=0; 
  307.     int l=0; 
  308.     char *s; 
  309.  
  310.     UPDATE_LEN; 
  311.     if (!iv->iLen) 
  312.         return(0); 
  313.     for (s=iv->iStr ; *s && *s != '\n' ; ++s) 
  314.         switch (*s) { 
  315.         case '\t': 
  316.         n += t - n % t; 
  317.         break; 
  318.         case '\b': 
  319.         if (n) 
  320.             --n; 
  321.         break; 
  322.         case '\r': 
  323.         l = max(n, l); 
  324.         n = 0; 
  325.         break; 
  326.         default: 
  327.         if (isprint(*s)) 
  328.             ++n; 
  329.         break; 
  330.     } 
  331.     return max(l, n); 
  332.  
  333. #define more n 
  334. #define next s++, n-- 
  335.  
  336. static int Val(char c, int b) 
  337.     int n; 
  338.  
  339.     if (isdigit(c)) n = c - '0'; 
  340.     else if (isalpha(c)) n = toupper(c) - ('A' - 10); 
  341.     else return(-1); 
  342.     if (n >= b) return(-1); 
  343.     return(n); 
  344.  
  345. imeth objrtn String_im_gProcess(object self)
  346. { String_iv_t *iv = GetIVs(String, self);
  347.     char *s, *d; 
  348.     int a, i, n; 
  349.  
  350.     UPDATE_LEN; 
  351.     s = d = iv->iStr; 
  352.     for (n=iv->iLen ; more ; ) 
  353.         if (*s != '\\') { 
  354.         *d++ = *s; 
  355.         next; 
  356.     } else { 
  357.         next; 
  358.         if (!more) 
  359.             break; 
  360.         switch (*s) { 
  361.             case 'N': 
  362.             case 'n': 
  363.             *d++ = '\n'; 
  364.             next; 
  365.             break; 
  366.             case 'T': 
  367.             case 't': 
  368.             *d++ = '\t'; 
  369.             next; 
  370.             break; 
  371.             case 'B': 
  372.             case 'b': 
  373.             *d++ = '\b'; 
  374.             next; 
  375.             break; 
  376.             case 'R': 
  377.             case 'r': 
  378.             *d++ = '\r'; 
  379.             next; 
  380.             break; 
  381.             case 'F': 
  382.             case 'f': 
  383.             *d++ = '\f'; 
  384.             next; 
  385.             break; 
  386.             case 'E': 
  387.             case 'e': 
  388.             *d++ = 27; 
  389.             next; 
  390.             break; 
  391.             case 'A': 
  392.             case 'a': 
  393.             *d++ = 7; 
  394.             next; 
  395.             break; 
  396.             case 'V': 
  397.             case 'v': 
  398.             *d++ = '\v'; 
  399.             next; 
  400.             break; 
  401.             case '^': 
  402.             next; 
  403.             if (!more) 
  404.                 goto end; 
  405.             *d++ = tolower(*s) - ('a' - 1); 
  406.             next; 
  407.             break; 
  408.             case 'X': 
  409.             case 'x': 
  410.             *d = '\0'; 
  411.             for (i = 0, next ; more && (a = Val(*s, 16)) != -1 && i != 2; next, ++i) 
  412.                 *d = 16 * *d + a; 
  413.             ++d; 
  414.             break; 
  415.             case 'D': 
  416.             case 'd': 
  417.             *d = '\0'; 
  418.             for (i = 0, next ; more && (a = Val(*s, 10)) != -1 && i != 3; next, ++i) 
  419.                 *d = 10 * *d + a; 
  420.             ++d; 
  421.             break; 
  422.             case '\0': 
  423.             break; 
  424.             default: 
  425.             if (isdigit(*s)) { 
  426.                 *d = '\0'; 
  427.                 for (i = 0; more && (a = Val(*s, 8)) != -1 && i != 3; next, ++i) 
  428.                     *d = 8 * *d + a; 
  429.                 ++d; 
  430.                 break; 
  431.             } 
  432.             *d++ = *s; 
  433.             next; 
  434.             break; 
  435.         } 
  436.     } 
  437.     end: 
  438.     *d = '\0'; 
  439.     iv->iLen = d - iv->iStr; 
  440.     FREE_UNUSED; 
  441.     return self; 
  442.  
  443. imeth objrtn String_im_gAppend(object self, object obj)
  444. { String_iv_t *iv = GetIVs(String, self);
  445.     char *str; 
  446.     int len, need; 
  447.  
  448.     if (!obj) 
  449.         return self; 
  450.     UPDATE_LEN; 
  451.     len = get_string(obj, &str, "Append", 2); 
  452.     need = iv->iLen + 1 + len; 
  453.     if (need > iv->iSize) { 
  454.         if (iv->iBlksz == 1) 
  455.             iv->iBlksz = ABS; 
  456.         SETSIZE(need); 
  457.         iv->iStr = (char *) MA_realloc(iv->iStr, iv->iSize); 
  458.     } 
  459.     memcpy(iv->iStr + iv->iLen, str, len); 
  460.     iv->iLen += len; 
  461.     iv->iStr[iv->iLen] = '\0'; 
  462.     return self; 
  463.  
  464. imeth int String_im_gWrite(object self, char *buf, unsigned len)
  465. { String_iv_t *iv = GetIVs(String, self);
  466.     int need; 
  467.  
  468.     UPDATE_LEN; 
  469.     need = iv->iLen + 1 + len; 
  470.     if (need > iv->iSize) { 
  471.         if (iv->iBlksz == 1) 
  472.             iv->iBlksz = ABS; 
  473.         SETSIZE(need); 
  474.         iv->iStr = (char *) MA_realloc(iv->iStr, iv->iSize); 
  475.     } 
  476.     memcpy(iv->iStr + iv->iLen, buf, len); 
  477.     iv->iLen += len; 
  478.     iv->iStr[iv->iLen] = '\0'; 
  479.     return len; 
  480.  
  481. imeth int String_im_gRead(object self, char *buf, unsigned n)
  482. { String_iv_t *iv = GetIVs(String, self);
  483.     int len; 
  484.  
  485.     UPDATE_LEN; 
  486.     len = n > (unsigned) iv->iLen ? iv->iLen : (int) n; 
  487.     memcpy(buf, iv->iStr, len); 
  488.     memmove(iv->iStr, iv->iStr+len, iv->iLen-len+1); 
  489.     iv->iLen -= len; 
  490.     FREE_UNUSED; 
  491.     return len; 
  492.  
  493. imeth char * String_im_gGets(object self, char *buf, int n)
  494. { String_iv_t *iv = GetIVs(String, self);
  495.     int len; 
  496.  
  497.     UPDATE_LEN; 
  498.     if (!iv->iLen) 
  499.         return NULL; 
  500.     if (n <= 0) 
  501.         return NULL; 
  502.     if (n-- == 1) { 
  503.         *buf = '\0'; 
  504.         return buf; 
  505.     } 
  506.     for (len=0 ; len < iv->iLen && iv->iStr[len++] != '\n' ; ); 
  507.     memcpy(buf, iv->iStr, len); 
  508.     memmove(iv->iStr, iv->iStr+len, iv->iLen-len+1); 
  509.     iv->iLen -= len; 
  510.     FREE_UNUSED; 
  511.     buf[len] = '\0'; 
  512.     return buf; 
  513.  
  514. imeth long String_im_gAdvance(object self, long n)
  515. { String_iv_t *iv = GetIVs(String, self);
  516.     int len; 
  517.  
  518.     UPDATE_LEN; 
  519.     len = n > (long) iv->iLen ? iv->iLen : (int) n; 
  520.     memmove(iv->iStr, iv->iStr+len, iv->iLen-len+1); 
  521.     iv->iLen -= len; 
  522.     FREE_UNUSED; 
  523.     return (long) len; 
  524.  
  525. imeth long String_im_gPosition(object self)
  526.     USE(self); 
  527.     return 0L; 
  528.  
  529. imeth long String_im_gLength(object self)
  530. { String_iv_t *iv = GetIVs(String, self);
  531.     UPDATE_LEN; 
  532.     return (long) iv->iLen; 
  533.  
  534. imeth int String_im_gEndOfStream(object self)
  535. { String_iv_t *iv = GetIVs(String, self);
  536.     UPDATE_LEN; 
  537.     return !iv->iLen; 
  538.  
  539. cvmeth objrtn String_cvm_vSprintf(object self, va_list _rest_)
  540.     char * fmt = va_arg(_rest_, char *);
  541.  
  542. #line 569 "string.d"
  543.     char buf[256]; 
  544.     MAKE_REST(fmt); 
  545.  
  546.     vsprintf(buf, fmt, _rest_); 
  547.     return gNewWithStr(self, buf); 
  548.  
  549. #line 585 "string.c"
  550.  
  551. static    objrtn    String_cfm_vSprintf(object self, ...)
  552. {
  553.     va_list    _rest_;
  554.     va_start(_rest_, self);
  555.     return String_cvm_vSprintf(self, _rest_);
  556. }
  557.  
  558.  
  559.  
  560. #line 576 "string.d"
  561. ivmeth objrtn String_ivm_vBuild(object self, va_list _rest_)
  562. { String_iv_t *iv = GetIVs(String, self);char * f = va_arg(_rest_, char *);
  563.     object obj; 
  564.     char *str, *pbuf; 
  565.     va_list ap; 
  566.     int len, argn, tlen; 
  567.     static char fun[] = "Build"; 
  568.     MAKE_REST(f); 
  569. #line 588 "string.d"
  570.     UPDATE_LEN; 
  571.     if (f) 
  572.         tlen = get_string((object) f, &str, fun, 2); 
  573.     else 
  574.         tlen = iv->iLen; 
  575.     ASSIGN_VA_LIST(ap, _rest_); 
  576.     for (argn=3 ; obj = va_arg(ap, object) ; ) 
  577.         tlen += get_string(obj, &str, fun, argn++); 
  578. #line 600 "string.d"
  579.     if (tlen >= iv->iSize) { 
  580.         if (iv->iBlksz == 1 && !f) 
  581.             iv->iBlksz = ABS; 
  582.         SETSIZE(tlen + 1); 
  583.         iv->iStr = (char *) MA_realloc(iv->iStr, iv->iSize); 
  584.     } 
  585. #line 610 "string.d"
  586.     pbuf = iv->iStr; 
  587.     if (f) { 
  588.         len = get_string((object)f, &str, fun, 2); 
  589.         if (len) 
  590.             memcpy(pbuf, str, len); 
  591.         pbuf += len; 
  592.     } else 
  593.         pbuf += iv->iLen; 
  594.     for (argn=3 ; obj = GetArg(object) ; ) { 
  595.         len = get_string(obj, &str, fun, argn++); 
  596.         if (len) { 
  597.             memcpy(pbuf, str, len); 
  598.             pbuf += len; 
  599.         } 
  600.     } 
  601.     *pbuf = '\0'; 
  602.     iv->iLen = tlen; 
  603.     return self; 
  604.  
  605. #line 642 "string.c"
  606.  
  607. static    objrtn    String_ifm_vBuild(object self, ...)
  608. {
  609.     va_list    _rest_;
  610.     va_start(_rest_, self);
  611.     return String_ivm_vBuild(self, _rest_);
  612. }
  613.  
  614.  
  615.  
  616. #line 630 "string.d"
  617. cvmeth objrtn String_cvm_vBuild(object self, va_list _rest_)
  618.     object obj; 
  619.     char *str, *pbuf; 
  620.     va_list ap; 
  621.     int len, argn, tlen=0; 
  622.     static char fun[] = "Build"; 
  623.     object newObj = oSuper(String_c, gNew, self)(self); 
  624.     ivType *iv = ivPtr(newObj); 
  625.     MAKE_REST(self); 
  626.  
  627.  
  628.  
  629.  
  630.     ASSIGN_VA_LIST(ap, _rest_); 
  631.     for (argn=2 ; obj = va_arg(ap, object) ; ) 
  632.         tlen += get_string(obj, &str, fun, argn++); 
  633.  
  634.  
  635.  
  636.     iv->iBlksz = 1; 
  637.     SETSIZE(tlen + 1); 
  638.     iv->iStr = (char *) MA_malloc(iv->iSize, &iv->iStr); 
  639.  
  640.  
  641.  
  642.  
  643.     pbuf = iv->iStr; 
  644.     for (argn=2 ; obj = GetArg(object) ; ) { 
  645.         len = get_string(obj, &str, fun, argn++); 
  646.         if (len) { 
  647.             memcpy(pbuf, str, len); 
  648.             pbuf += len; 
  649.         } 
  650.     } 
  651.     *pbuf = '\0'; 
  652.     iv->iLen = tlen; 
  653.     return newObj; 
  654.  
  655. #line 694 "string.c"
  656.  
  657. static    objrtn    String_cfm_vBuild(object self, ...)
  658. {
  659.     va_list    _rest_;
  660.     va_start(_rest_, self);
  661.     return String_cvm_vBuild(self, _rest_);
  662. }
  663.  
  664.  
  665. #line 670 "string.d"
  666. static int get_string(object obj, char **str, char *fun, int argn) 
  667.     ivType *iv2; 
  668.     char buf[80]; 
  669.  
  670.     if (!obj) { 
  671.         *str = ""; 
  672.         return 0; 
  673.     } else if (!IsObj(obj)) { 
  674.         *str = (char *) obj; 
  675.         return strlen((char *) obj); 
  676.     } 
  677.     if (!gIsKindOf(obj, CLASS)) { 
  678.         sprintf(buf, "%s::String:  Arg %d incorrect type.\n", fun, argn); 
  679.         gError(Dynace, buf); 
  680.     } 
  681.     iv2 = ivPtr(obj); 
  682.     *str = iv2->iStr; 
  683.     return iv2->iCalcLen ? (iv2->iLen=strlen(iv2->iStr)) : iv2->iLen; 
  684.  
  685. imeth char String_im_gCharValueAt(object self, int i)
  686. { String_iv_t *iv = GetIVs(String, self);
  687.     UPDATE_LEN; 
  688.     if (i < 0 || i > iv->iLen) 
  689.         gError(self, "CharValue::String:  Index out of range.\n"); 
  690.     return iv->iStr[i]; 
  691.  
  692. imeth objrtn String_im_gChangeCharAt(object self, int i, int c)
  693. { String_iv_t *iv = GetIVs(String, self);
  694.     UPDATE_LEN; 
  695.     if (i < 0 || i > iv->iLen) 
  696.         gError(self, "ChangeCharAt::String:  Index out of range.\n"); 
  697.     if (i == iv->iLen) { 
  698.         char buf[2]; 
  699.         buf[0] = c; 
  700.         buf[1] = '\0'; 
  701.         return gAppend(self, (object) buf); 
  702.     } 
  703.     iv->iStr[i] = c; 
  704.     return self; 
  705.  
  706. imeth objrtn String_im_gToLower(object self)
  707. { String_iv_t *iv = GetIVs(String, self);
  708.     char *s; 
  709.     int len; 
  710.  
  711.     UPDATE_LEN; 
  712.     s = iv->iStr; 
  713.     len = iv->iLen; 
  714.     for ( ; len-- ; s++) 
  715.         *s = tolower(*s); 
  716.     return self; 
  717.  
  718. imeth objrtn String_im_gToUpper(object self)
  719. { String_iv_t *iv = GetIVs(String, self);
  720.     char *s; 
  721.     int len; 
  722.  
  723.     UPDATE_LEN; 
  724.     s = iv->iStr; 
  725.     len = iv->iLen; 
  726.     for ( ; len-- ; s++) 
  727.         *s = toupper(*s); 
  728.     return self; 
  729.  
  730. imeth objrtn String_im_gSubString(object self, int beg, int num)
  731. { String_iv_t *iv = GetIVs(String, self);
  732.     object obj = oSuper(String_c, gNew, CLASS)(CLASS); 
  733.     ivType *iv2 = ivPtr(obj); 
  734.  
  735.     UPDATE_LEN; 
  736.     if (beg < 0) 
  737.         beg = iv->iLen + beg; 
  738.     if (num < 0) { 
  739.         beg += num + 1; 
  740.         num = -num; 
  741.     } 
  742.  
  743.     if (beg >= iv->iLen || beg < 0) 
  744.         num = 0; 
  745.     else { 
  746.         int n = iv->iLen - beg; 
  747.         num = num < n ? num : n; 
  748.     } 
  749.     iv2->iBlksz = 1; 
  750.     SETSIZE(num+1); 
  751.     iv2->iLen = num; 
  752.     iv2->iStr = (char *) MA_malloc(iv2->iSize, &iv2->iStr); 
  753.     if (num) 
  754.         memcpy(iv2->iStr, iv->iStr+beg, num); 
  755.     iv2->iStr[num] = '\0'; 
  756.     return obj; 
  757.  
  758. imeth objrtn String_im_gTake(object self, int n)
  759. { String_iv_t *iv = GetIVs(String, self);
  760.     int i, len; 
  761.     char *s; 
  762.  
  763.     UPDATE_LEN; 
  764.     len = n < 0 ? -n : n; 
  765.     if (len == iv->iLen) 
  766.         return self; 
  767.     if (len >= iv->iSize) { 
  768.         SETSIZE(len + 1); 
  769.         iv->iStr = (char *) MA_realloc(iv->iStr, iv->iSize); 
  770.     } 
  771.     s = iv->iStr; 
  772.     if (n >= 0) { 
  773.         for (i=iv->iLen ; i < len ; i++) 
  774.             s[i] = ' '; 
  775.         goto end; 
  776.     } 
  777.     if (iv->iLen < len) { 
  778.         n = len - iv->iLen; 
  779.         memmove(s + n, s, iv->iLen); 
  780.         for (i = 0; i < n ; i++) 
  781.             s[i] = ' '; 
  782.         goto end; 
  783.     } 
  784.     memmove(s, s + (iv->iLen - len), len); 
  785.     end: 
  786.     s[len] = '\0'; 
  787.     iv->iLen = len; 
  788.     FREE_UNUSED; 
  789.     return self; 
  790.  
  791. imeth objrtn String_im_gDrop(object self, int n)
  792. { String_iv_t *iv = GetIVs(String, self);
  793.     int an; 
  794.  
  795.     if (!n) 
  796.         return self; 
  797.     UPDATE_LEN; 
  798.     an = n < 0 ? -n : n; 
  799.     if (an >= iv->iLen) 
  800.         iv->iLen = 0; 
  801.     else { 
  802.         if (n > 0) 
  803.             memmove(iv->iStr, iv->iStr + n, iv->iLen - n); 
  804.         iv->iLen -= an; 
  805.     } 
  806.     iv->iStr[iv->iLen] = '\0'; 
  807.     FREE_UNUSED; 
  808.     return self; 
  809.  
  810. #define ISspace(c) ((c) == ' ' || (c) == '\t' || (c) == '\n' || (c) == '\r') 
  811.  
  812. imeth objrtn String_im_gStripLeft(object self)
  813. { String_iv_t *iv = GetIVs(String, self);
  814.     int i, n; 
  815.     char *s = iv->iStr; 
  816.  
  817.     UPDATE_LEN; 
  818.     for (i=0, n=iv->iLen ; n && ISspace(s[i]) ; ++i, --n); 
  819.     if (!i) 
  820.         return self; 
  821.     if (n) 
  822.         memmove(s, s + i, n); 
  823.     iv->iLen = n; 
  824.     s[n] = '\0'; 
  825.     FREE_UNUSED; 
  826.     return self; 
  827.  
  828. imeth objrtn String_im_gStripRight(object self)
  829. { String_iv_t *iv = GetIVs(String, self);
  830.     int n; 
  831.     char *s = iv->iStr; 
  832.  
  833.     UPDATE_LEN; 
  834.     for (n = iv->iLen - 1 ; n >= 0 && ISspace(s[n]) ; n--); 
  835.     s[iv->iLen = n + 1] = '\0'; 
  836.     FREE_UNUSED; 
  837.     return self; 
  838.  
  839. imeth objrtn String_im_gStripCenter(object self)
  840. { String_iv_t *iv = GetIVs(String, self);
  841.     int i, n; 
  842.     char *s = iv->iStr; 
  843.  
  844.     UPDATE_LEN; 
  845.     for (i=0, n=iv->iLen ; n && ISspace(s[i]) ; ++i, --n); 
  846.     if (n && i) 
  847.         memmove(s, s + i, n); 
  848.     for (--n ; n >= 0 && ISspace(s[n]) ; n--); 
  849.     s[iv->iLen = n + 1] = '\0'; 
  850.     FREE_UNUSED; 
  851.     return self; 
  852.  
  853. imeth objrtn String_im_gJustifyLeft(object self)
  854. { String_iv_t *iv = GetIVs(String, self);
  855.     char *s = iv->iStr; 
  856.     int n, i; 
  857.  
  858.     UPDATE_LEN; 
  859.     n = iv->iLen; 
  860.     for (i=0 ; i < n && ISspace(s[i]) ; ++i); 
  861.     if (!i) 
  862.         return self; 
  863.     memmove(s, s + i, n-i); 
  864.     for (i=n-i ; i < n ; ) 
  865.         s[i++] = ' '; 
  866.     return self; 
  867.  
  868. imeth objrtn String_im_gJustifyRight(object self)
  869. { String_iv_t *iv = GetIVs(String, self);
  870.     char *s = iv->iStr; 
  871.     int n, i, p; 
  872.  
  873.     UPDATE_LEN; 
  874.     n = iv->iLen; 
  875.     for (i=n-1 ; i >= 0 && ISspace(s[i]) ; --i); 
  876.     p = n - (i + 1); 
  877.     if (!p) 
  878.         return self; 
  879.     memmove(s + p, s, n-p); 
  880.     for (i=0 ; i < p ; ) 
  881.         s[i++] = ' '; 
  882.     return self; 
  883.  
  884. imeth objrtn String_im_gJustifyCenter(object self)
  885. { String_iv_t *iv = GetIVs(String, self);
  886.     char *s = iv->iStr; 
  887.     int n, left, right, left2, p, i; 
  888.  
  889.     UPDATE_LEN; 
  890.     n = iv->iLen; 
  891.     for (left=0 ; left < n && ISspace(s[left]) ; ++left); 
  892.     for (right=0, i=n-1 ; i >= 0 && ISspace(s[i]) ; --i, ++right); 
  893.     left2 = (left + right) / 2; 
  894.     if (left2 == left) 
  895.         return self; 
  896.     if (left2 < left) { 
  897.         p = left - left2; 
  898.         memmove(s, s + p, n - p); 
  899.         for (i=n-(p+1) ; i < n ; ) 
  900.             s[i--] = ' '; 
  901.     } else { 
  902.         p = left2 - left; 
  903.         memmove(s + p, s, n - p); 
  904.         for (i=0 ; i < p ; ) 
  905.             s[i++] = ' '; 
  906.     } 
  907.     return self; 
  908.  
  909. imeth int String_im_gEqual(object self, object obj)
  910. { String_iv_t *iv = GetIVs(String, self);
  911.     char *str; 
  912.     int len; 
  913.  
  914.     if (EQ(self, obj)) 
  915.         return 1; 
  916.     if (IsObj(obj)) { 
  917.         ivType *iv2; 
  918.         if (NEQ(ClassOf(self), ClassOf(obj))) 
  919.             return 0; 
  920.         iv2 = ivPtr(obj); 
  921.         if (iv2->iCalcLen) 
  922.             iv2->iLen = strlen(iv2->iStr); 
  923.         len = iv2->iLen; 
  924.         str = iv2->iStr; 
  925.     } else { 
  926.         str = (char *) obj; 
  927.         len = str ? strlen(str) : 0; 
  928.     } 
  929.     UPDATE_LEN; 
  930.     if (iv->iLen != len) 
  931.         return 0; 
  932.     if (len) 
  933.         return memcmp(iv->iStr, str, len) ? 0 : 1; 
  934.     else 
  935.         return 1; 
  936.  
  937. imeth objrtn String_im_gCopy(object self)
  938.     return gNewWithObj(ClassOf(self), self); 
  939.  
  940.  
  941. #line 998 "string.c"
  942.  
  943. objrtn    String_initialize(void)
  944. {
  945.     static  CRITICALSECTION  cs;
  946.     static  int volatile once = 0;
  947.  
  948.     ENTERCRITICALSECTION(_CI_CS_);
  949.     if (!once) {
  950.         INITIALIZECRITICALSECTION(cs);
  951.         once = 1;
  952.     }
  953.     LEAVECRITICALSECTION(_CI_CS_);
  954.  
  955.     ENTERCRITICALSECTION(cs);
  956.  
  957.     if (String_c) {
  958.         LEAVECRITICALSECTION(cs);
  959.         return String_c;
  960.     }
  961.     INHIBIT_THREADER;
  962.     Stream_initialize();
  963.     if (String_c)  {
  964.         ENABLE_THREADER;
  965.         LEAVECRITICALSECTION(cs);
  966.         return String_c;
  967.     }
  968.     String_c = gNewClass(Class, "String", sizeof(String_iv_t), 0, Stream, END);
  969.     cMethodFor(String, gNewWithStr, New);
  970.     cMethodFor(String, gNewWithInt, String_cm_gNewWithInt);
  971.     cMethodFor(String, gNew, String_cm_gNew);
  972.     cMethodFor(String, gNewWithObj, String_cm_gNewWithObj);
  973.     cvMethodFor(String, vBuild, String_cvm_vBuild, String_cfm_vBuild);
  974.     cvMethodFor(String, vSprintf, String_cvm_vSprintf, String_cfm_vSprintf);
  975.     iMethodFor(String, gCompareNI, String_im_gCompareNI);
  976.     iMethodFor(String, gAppend, String_im_gAppend);
  977.     iMethodFor(String, gChangeStrValue, String_im_gChangeStrValue);
  978.     iMethodFor(String, gPosition, String_im_gPosition);
  979.     iMethodFor(String, gTake, String_im_gTake);
  980.     iMethodFor(String, gLength, String_im_gLength);
  981.     iMethodFor(String, gWrite, String_im_gWrite);
  982.     iMethodFor(String, gCompare, String_im_gCompare);
  983.     iMethodFor(String, gEndOfStream, String_im_gEndOfStream);
  984.     iMethodFor(String, gCompareN, String_im_gCompareN);
  985.     iMethodFor(String, gPrintLength, String_im_gPrintLength);
  986.     iMethodFor(String, gCompareI, String_im_gCompareI);
  987.     iMethodFor(String, gToLower, String_im_gToLower);
  988.     iMethodFor(String, gAdvance, String_im_gAdvance);
  989.     iMethodFor(String, gSize, String_im_gSize);
  990.     ivMethodFor(String, vBuild, String_ivm_vBuild, String_ifm_vBuild);
  991.     iMethodFor(String, gChangeCharAt, String_im_gChangeCharAt);
  992.     iMethodFor(String, gCharValueAt, String_im_gCharValueAt);
  993.     iMethodFor(String, gDispose, String_im_gDispose);
  994.     iMethodFor(String, gProcess, String_im_gProcess);
  995.     iMethodFor(String, gStripCenter, String_im_gStripCenter);
  996.     iMethodFor(String, gEqual, String_im_gEqual);
  997.     iMethodFor(String, gToUpper, String_im_gToUpper);
  998.     iMethodFor(String, gJustifyRight, String_im_gJustifyRight);
  999.     iMethodFor(String, gGets, String_im_gGets);
  1000.     iMethodFor(String, gDrop, String_im_gDrop);
  1001.     iMethodFor(String, gGCDispose, String_im_gDispose);
  1002.     iMethodFor(String, gJustifyLeft, String_im_gJustifyLeft);
  1003.     iMethodFor(String, gStringRepValue, String_im_gStringRepValue);
  1004.     iMethodFor(String, gJustifyCenter, String_im_gJustifyCenter);
  1005.     iMethodFor(String, gHash, String_im_gHash);
  1006.     iMethodFor(String, gChangeValue, ChangeValue);
  1007.     iMethodFor(String, gCopy, String_im_gCopy);
  1008.     iMethodFor(String, gSubString, String_im_gSubString);
  1009.     iMethodFor(String, gDeepDispose, String_im_gDispose);
  1010.     iMethodFor(String, gRead, String_im_gRead);
  1011.     iMethodFor(String, gDeepCopy, String_im_gCopy);
  1012.     iMethodFor(String, gStringValue, String_im_gStringValue);
  1013.     iMethodFor(String, gStripLeft, String_im_gStripLeft);
  1014.     iMethodFor(String, gStripRight, String_im_gStripRight);
  1015.  
  1016.     ENABLE_THREADER;
  1017.  
  1018.     LEAVECRITICALSECTION(cs);
  1019.  
  1020.     return String_c;
  1021. }
  1022.  
  1023.  
  1024.  
  1025.